//****** Array.from()
// 1.将类数组对象转换为真正数组
var arrayLike = {
    0: 'js', 
    1: 'jquery',
    2: 'node',
    3: ['html','css','bootstrap'],
    length: 4
}

var arr = Array.from(arrayLike)
console.log(arr)

// 2.将字符串转换为数组
var charArr = Array.from("abc");
console.log(charArr)

// 3.返回集合中包含的对象数组
var setArr = [11,22,33]
var setObj = new Set(setArr)
console.log(setObj)
var objArr = Array.from(setObj);
console.log(objArr)

// 4.Array.from还可以接受第二个参数，作用类似于数组的map方法，用箭头语法和映射函数更改元素的值
console.log(Array.from(setObj, item => item + 1))

//****** Array.isArray() 测试对象是否为数组，返回true或false
var isArray = []
console.log(Array.isArray(isArray))

//****** Array.of() 传入的参数返回一个数组
console.log(Array.of('ligai'))

// Array.of()和new Array()的区别
var arr1 = Array.of(9)
var arr2 = new Array(9)
console.log(arr1)
console.log(arr2)

//****** concat() 组合两个或两个以上的数组
var concat_a = ["a","b","c"]
var concat_b = ["A","B","C"]
var concat_c = [1,2,3]
var concat_d = concat_c.concat(concat_a,concat_b)
console.log(concat_d)

//****** copyWithin() 从数组的指定位置拷贝元素到数组的另一个指定位置中
var copyW = ["12","34","56","78","90"]
console.log(copyW.copyWithin(1,2))

//****** entries() 返回一个迭代器，它返回数组的键/值对
var entrie = ["a","b","c"].entries()
console.log(entrie.next().value)
console.log(entrie.next().value)
console.log(entrie.next().value)

//****** every() 当且仅当针对数组中所有元素调用判定函数都返回true,它才返回true
var everyArr = [1,3,5,7,9,10]
console.log(everyArr.every(function(value){return value<10}))

//****** some() 当数组中至少有一个元素调用判定函数返回true，它就返回true
console.log(everyArr.some(function(value){return value<10}))

//****** fill() 指定值填充数组
var fillArr = [0,0,0]
console.log(fillArr.fill(7,1))
console.log(fillArr.fill(7))

//****** filter() 返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的：该函数返回true或false
var filterArr = [1,3,5,7,9]
var smallvalues = filterArr.filter(function(x){return x<5})
console.log(smallvalues)

//****** find() 返回数组中第一个满足提供的测试函数的元素的值。否则undefined返回。
var findArr = [11,34,67,89,28]
var found1 = findArr.find(function(value){
    return value > 60
})
console.log("元素值："+found1)

//****** findIndex() 返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1
var found2 = findArr.findIndex(function(value){
    return value > 60
})
console.log("索引值："+found2)

//****** forEach() 数组中的每个元素执行指定操作
var data = [1,2,3,4,5]
data.forEach(function(value,i,arr){
    arr[i] = value+1
})
console.log(data)

//****** map() 将调用的数组的每个元素传递给指定的函数，并返回一个数组，她包含该函数的返回值
var mapArr = [1,2,3,4]
var map1 = mapArr.map(function(x){return x*2})
console.log(map1)

//****** indexOf() 返回找到的第一个匹配元素的索引值，如果没有找到就返回-1，从头至尾搜索
var indexOfArr = [0,1,4,8,0]
console.log(indexOfArr.indexOf(0))

//****** lastIndexOf() 返回找到的最后一个匹配元素的索引值，从末尾开始搜索
console.log(indexOfArr.lastIndexOf(0))

//****** includes() 确定数组是否包含某个元素，返回true或false
var includesArr = [2,5,6,8]
console.log(includesArr.includes(5))

//****** join() 将数组中所有元素都转化成字符串并连接在一起，返回最后生成的字符串，可以指定分隔符，如果不指定默认使用逗号
var joinArr = [1,2,3,4]
console.log(joinArr.join())
console.log(joinArr.join(" "))

//****** keys() 返回一个新数组迭代器对象，其中包含数组中每个索引的键
var keysArr = ["a", ,"c"]
console.log(Object.keys(keysArr))
console.log([...keysArr.keys()])

//****** push() 在数组尾部添加一个或多个元素，并返回新的数组长度
//****** pop() 删除数组的最后一个元素，减小数组长度并返回它删除的值。组合使用push()和pop()能够用JavaScript数组实现先进后出的栈。
var stack = [];
stack.push(1,2)
console.log(stack)
stack.pop()
console.log(stack)

//****** unshift() 在数组的头部添加一个或多个元素，并返回新的数组长度
//****** shift() 删除数组的第一个元素并返回它删除的值。组合使用unshift()和shift()能够用JavaScript数组实现先进先出的队列
var queue = []
queue.unshift(11,22,33)
console.log(queue)
queue.shift()
console.log(queue)

//****** toString() 将数组转化成字符串，和不使用任何参数调用join()方法返回的字符串是一样的。
//****** toLocalString() 是toString()方法的本地化版本。
// toString()和toLocaleString()的区别：1）当数字是四位数及以上时，toLocaleString()会让数字三位三位一分隔。2）当目标是标准时间格式时，返回的格式不同
var  number1 = 12345
console.log(number1.toString())
console.log(number1.toLocaleString())
console.log(new Date().toString())
console.log(new Date().toLocaleString())


//****** reduce()和reduceRight() 都是使用指的函数将数组元素进行结合，生成单个值，这在函数编程中是常见的操作，也可以成为“注入”和“折叠”
// reduce()的化简操作的优先顺序是从左到右；reduceRight()是从右往左。
var sumArr = [12,34,56,78]
function sum(arr) {
    return arr.reduce(function (prev, curr, idx, arr) {
        return prev + curr;
    }) 
}
console.log(sum(sumArr))

//****** reverse() 将数组中的元素颠倒顺序，返回逆序的数组
var reverseArr = [1,3,5,7]
reverseArr.reverse()
console.log(reverseArr)
console.log(reverseArr.join())

//****** slice() 返回数组的一个片段或子数组，她的两个参数分别制定了片段的开始和结束位置。原数组不会被修改
var sliceArr = ["a","b","c","d"]
console.log(sliceArr.slice(1,3))
console.log(sliceArr.slice(3))
console.log(sliceArr.slice(1,-1))

//****** splice() 从数组中删除元素、插入元素到数组中或者同时完成这两种操作。第一个参数指定插入或删除的起始位置。第二个参数指定了应该从数组中删除的个数。
// 如果省略第二个参数，从起始点开始到数组结尾的所有元素都将被删除，紧随其后的任意个数的参数指定了要插入到数组中的元素。原数组内容被修改
var months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
console.log(months)

//****** sort() 将数组中的元素排序并返回排序后的数组。默认排序顺序是以字母表排序
var months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
var sortArr = [33,4,1111,222]
console.log(sortArr.sort())
var compareForSort = sortArr.sort(function(a,b){
    return a-b
})
console.log(compareForSort)

//****** values()
